/* Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * HOJA DE TRABAJO #8
 * Fecha de Entrega: Jueves 27 de Octubre de 2011
 */

/**
 * Clase  utilizada para instanciar los diferentes tipos de sets. 
 * @author José Antonio Bagur - 10275
 */

/* SE IMPORTAN LOS PAQUETES A UTILIZAR EN LA APLICACIÓN */
import java.io.*;

public class WordTypeCounter {
        
        public static void main(String[] args) throws Exception {
            if(args.length > 1) {
                File wordFile = new File(args[0]);
                File textFile = new File(args[1]);
                BufferedReader wordreader;
                BufferedReader textreader;
			
		int verbs=0;
		int nouns=0;
		int adjectives=0;
		int adverbs=0;
		int gerunds=0;
			
		long starttime;
		long endtime;
			
		if(wordFile.isFile() && textFile.isFile()) {
                    try {
                        wordreader = new BufferedReader(new FileReader(wordFile));
			textreader = new BufferedReader(new FileReader(textFile));
                    } catch (Exception ex) {
                        System.out.println("Error al leer!");
                        return;
                    }
                    
                    /* ------> INTRUCCIONES PARA SELECCIONAR IMPLEMENTACIONES:
                     * MODIFICAR EL PARÁMETRO DEL MÉTODO generateSet(), DEFINIÉNDOLO 
                     * COMO UN ENTERO, DE 1 A 6. 
                     * 
                     * LAS ESTRUCTURAS DE DATOS DISPONIBLES SON LAS SIGUIENTES:
                     * 
                     * 1. SIMPLE SET (DEFAULT)
                     * 2. BINARY SEARCH TREE
                     * 3. SINGLY LINKED LIST
                     * 4. CIRCULAR LIST
                     * 5. RED BLACK TREE
                     * 6. AVL TREE
                     */
                    
                    WordSet words =  WordSetFactory.generateSet(1);
					
                    String line = null;
                    String[] wordParts;
				
                    starttime = System.currentTimeMillis();
                    line = wordreader.readLine();
                    while(line!=null) {
                        wordParts = line.split("\\."); 
                        if(wordParts.length == 2) {
                            words.add(new Word(wordParts[0].trim(),wordParts[1].trim()));
                        } 
                        line = wordreader.readLine();
                    }
                    wordreader.close();
                    endtime = System.currentTimeMillis();
				
                    System.out.println("Palabras cargadas en " + (endtime-starttime) + " ms.");
				
                    starttime = System.currentTimeMillis();
                    line = textreader.readLine();
                    String[] textParts;
                    Word currentword;
                    Word lookupword = new Word();
				
                    while(line!=null) {
                        textParts = line.split("[^\\w-]+");
                        for(int i=0;i<textParts.length;i++) {
                            lookupword.setWord(textParts[i].trim().toLowerCase());
                            currentword = words.get(lookupword);
                            if(currentword != null) {
                                if(currentword.getType().equals("v-d") || currentword.getType().equals("v") || currentword.getType().equals("q"))
                                    verbs++;
                                    else if(currentword.getType().equals("g") )
                                        gerunds++;
                                    else if(currentword.getType().equals("a-s") || currentword.getType().equals("a-c") || currentword.getType().equals("a"))
					adjectives++;
                                    else if(currentword.getType().equals("e"))
                                        adverbs++;
                                    else 
                                        nouns++;
                            }
			}
                        
                        line = textreader.readLine();
                    }
				
                    textreader.close();
                    endtime = System.currentTimeMillis();
                    System.out.println("Texto analizado en " + (endtime-starttime) + " ms.");
				
                    System.out.println("El texto tiene:");
                    System.out.println(verbs + " verbos");
                    System.out.println(nouns + " sustantivos");
                    System.out.println(adjectives + " adjetivos");
                    System.out.println(adverbs + " adverbios");
                    System.out.println(gerunds + " gerundios");
				
                }
                        
                else {
                    System.out.println("No encuentro los archivos :'( ");
		}
		
            } 
            
            else {
                System.out.println("Faltan Parametros.");
            }
	}
        
}   // FIN DE LA CLASE WORDTYPECOUNTER
